package com.example.domain.repository;

import com.example.domain.entity.PriceListEntry;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;

/**
 * 价目条目Repository
 * 
 * @author Means
 * @since 2025-10-27
 */
@Repository
public interface PriceListEntryRepository extends JpaRepository<PriceListEntry, String> {
    
    // ========== 基础查询 ==========
    
    /**
     * 根据价目表ID查询未删除的价目条目
     * 
     * @param priceListId 价目表ID
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    List<PriceListEntry> findByPriceListIdAndIsDeleted(String priceListId, Boolean isDeleted);
    
    /**
     * 根据商品ID查询未删除的价目条目
     * 
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    List<PriceListEntry> findByProductIdAndIsDeleted(String productId, Boolean isDeleted);
    
    /**
     * 根据价目表ID和商品ID查询未删除的价目条目
     * 
     * @param priceListId 价目表ID
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 价目条目对象
     */
    Optional<PriceListEntry> findByPriceListIdAndProductIdAndIsDeleted(String priceListId, String productId, Boolean isDeleted);
    
    /**
     * 根据基础单位查询未删除的价目条目
     * 
     * @param baseUnit 基础单位
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    List<PriceListEntry> findByBaseUnitAndIsDeleted(String baseUnit, Boolean isDeleted);
    
    // ========== 价格范围查询 ==========
    
    /**
     * 查询价格在指定范围内的未删除价目条目
     * 
     * @param priceListId 价目表ID
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    @Query("SELECT e FROM PriceListEntry e WHERE e.priceListId = :priceListId " +
           "AND e.unitPrice BETWEEN :minPrice AND :maxPrice " +
           "AND e.isDeleted = :isDeleted")
    List<PriceListEntry> findByPriceRange(@Param("priceListId") String priceListId,
                                         @Param("minPrice") BigDecimal minPrice,
                                         @Param("maxPrice") BigDecimal maxPrice,
                                         @Param("isDeleted") Boolean isDeleted);
    
    // ========== 批量查询 ==========
    
    /**
     * 根据商品ID列表批量查询价目条目
     * 
     * @param priceListId 价目表ID
     * @param productIds 商品ID列表
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    @Query("SELECT e FROM PriceListEntry e WHERE e.priceListId = :priceListId " +
           "AND e.productId IN :productIds " +
           "AND e.isDeleted = :isDeleted")
    List<PriceListEntry> findByPriceListIdAndProductIds(@Param("priceListId") String priceListId,
                                                        @Param("productIds") List<String> productIds,
                                                        @Param("isDeleted") Boolean isDeleted);
    
    /**
     * 根据价目表ID列表批量查询价目条目
     * 
     * @param priceListIds 价目表ID列表
     * @param productId 商品ID
     * @param isDeleted 是否删除
     * @return 价目条目列表
     */
    @Query("SELECT e FROM PriceListEntry e WHERE e.priceListId IN :priceListIds " +
           "AND e.productId = :productId " +
           "AND e.isDeleted = :isDeleted " +
           "ORDER BY e.createdAt DESC")
    List<PriceListEntry> findByPriceListIdsAndProductId(@Param("priceListIds") List<String> priceListIds,
                                                        @Param("productId") String productId,
                                                        @Param("isDeleted") Boolean isDeleted);
    
    /**
     * 根据价目表ID软删除所有价目条目
     *
     * @param priceListId 价目表ID
     */
    @Modifying
    @Query("UPDATE PriceListEntry e SET e.isDeleted = true, e.deletedAt = CURRENT_TIMESTAMP WHERE e.priceListId = :priceListId AND e.isDeleted = false")
    void softDeleteByPriceListId(@Param("priceListId") String priceListId);
    
    // ========== 分页查询 ==========
    
    /**
     * 根据价目表ID分页查询未删除的价目条目
     * 
     * @param priceListId 价目表ID
     * @param isDeleted 是否删除
     * @param pageable 分页参数
     * @return 价目条目分页结果
     */
    Page<PriceListEntry> findByPriceListIdAndIsDeleted(String priceListId, Boolean isDeleted, Pageable pageable);
    
    // ========== 自定义查询 ==========
    
    /**
     * 根据ID查询未删除的价目条目
     * 
     * @param id 价目条目ID
     * @return 价目条目对象
     */
    @Query("SELECT e FROM PriceListEntry e WHERE e.id = :id AND e.isDeleted = false")
    Optional<PriceListEntry> findByIdAndNotDeleted(@Param("id") String id);
    
    /**
     * 统计价目表中未删除的条目数量
     * 
     * @param priceListId 价目表ID
     * @param isDeleted 是否删除
     * @return 条目数量
     */
    Long countByPriceListIdAndIsDeleted(String priceListId, Boolean isDeleted);
}

